package com.vvhard.javaagent;

import java.lang.instrument.Instrumentation;

/**
 * @author zhangqirong
 * @Date 2022/4/4
 */
public class MyAgent {

    private static Instrumentation instrumentation;

    /**
     * 该方法在main方法之前执行，与main方法运行在同一个jvm
     * @param agentArgs premain得到的程序参数。随 "- com.vvhard.javaagent" 传入
     * @param inst      由jvm自动传入由 JVM 自动传入。java.lang.instrument.Instrumentation 是 instrument 包中定义的一个接口，
     *                  也是这个包的核心部分，集中了其中几乎所有的功能方法，例如类定义的转换和操作等等。
     *                  它是agent技术主要使用的API，我们可以使用它来改变和重新定义类的行为。

     */
    public static void premain(String agentArgs, Instrumentation inst){

        System.out.println("MyAgent premain print !!!");
        System.out.println("javaagent args is:" + agentArgs);
        instrumentation = inst;

        inst.addTransformer(new SimpleClassTransformer());

    }

    /**
     * 该方法在main方法之前执行，与main方法运行在同一个jvm.
     * 不存在premain(String agentArgs, Instrumentation inst)方法则会执行该方法
     * @param agentArgs premain得到的程序参数。随 "- com.vvhard.javaagent" 传入
     *
     */
    public static void premain(String agentArgs){
        System.out.println("MyAgent premain print !!!");
        System.out.println("javaagent args is:" + agentArgs);

    }

}
